{
  class HashTable {
    /**
     * 这里数组使用的是定容数组，而且数组的大小是一个质数
     *  因为会需要数组的容量进行处理散列算法，所以 质数 很关键
     */
    public table: any[] = new Array(137);

    // 简单的散列函数（真实的这个函数肯定是非常复杂的，这里我的意思是大致模拟一下）
    private simpHash(data: any): number {
      // 霍纳算法
      const H = 37;
      var total = 0;
      for (var i = 0; i < data.length; ++i) {
        total += H * total + data.charCodeAt(i);
      }
      total = total % this.table.length;
      if (total < 0) {
        total += this.table.length - 1;
      }
      return parseInt(total as unknown as string);
    }

    // 插入元素
    public put(data: any, value: any) {
      // 通过这里也可以知道 散列函数是非常重要的，一定要确保的是不发生碰撞
      let index = this.simpHash(data);
      this.table[index] = value;
    }

    // 显示散列表中的元素
    public showDistro() {
      for (var i = 0; i < this.table.length; ++i) {
        if (this.table[i] != undefined) {
          console.log(i + ": " + this.table[i]);
        }
      }
    }

    // 获取值
    public get(key: any): any {
      return this.table[this.simpHash(key)];
    }
  }

  let table1 = new HashTable();
  table1.put("Jimmy", 111);
  table1.put("xuexue", 222);
  table1.put("Jack", 333);
  table1.put("Henry", 444);
  table1.put(22, 444);
  table1.put("22", "what");
  table1.showDistro();
}
